﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using OpenLab.BLL;

namespace OpenLab.UI.Parametrage
{
    public partial class Tube : Form
    {
        /*declaration**************************************************/
        readonly TubeBLL _repository = new TubeBLL();//moteur de methode
        private Model.Tube _tube = new Model.Tube();//objet principale
        private List<Model.Tube> _tubes = new List<Model.Tube>();//liste d'objets

        readonly BindingSource _bs = new BindingSource();//binding source liste
        /**************************************************************/


        /*constructeur*************************************************/
        public Tube()
        {
            InitializeComponent();

            InitializeForm();//initialiser le formulaire
        }
        /**************************************************************/


        /*initialisation avant chargement de deonne*********************/
        void InitializeForm()
        {
            InitializeDataList(); //init grid (choisir les option de selection et mise a jour)

            LoadData(); //charger les donnees

            MiseEnFormeGrid(); //mettre en forme le grid de donnees

            //ajouter les evennements sur les boutons
            okbtn.Click += okbtn_Click;
            filtertxt.TextChanged += filtertxt_TextChanged;

            //methode anonyme sur ajoutbtn (pour demo)
            ajoutbtn.Click += delegate { ClearData(); };
            cancelbtn.Click += delegate { ClearData(); };

            //set role sur botons
            exitbtn.DialogResult = DialogResult.Cancel;//informer windows que exitbtn est un bouton pour quiter form
        }


        void InitializeDataList()
        {
            tubesdgv.ReadOnly = true; //disable edit
            tubesdgv.AllowUserToAddRows = false; //disable add new row
            tubesdgv.AllowUserToDeleteRows = true; //enable delete row

            tubesdgv.UserDeletingRow += tubesdgv_UserDeletingRow; //add delete event
            tubesdgv.CellContentClick += tubesdgv_CellContentClick; //add click element event
        }
        /**************************************************************/


        /*evenement sur les controles utilisateur**********************/
        void filtertxt_TextChanged(object sender, EventArgs e)
        {
            // ReSharper disable once PossibleNullReferenceException
            _bs.Filter = String.Format(" abriviation LIKE '%{0}%' or designation LIKE '%{0}%' ", (sender as TextBox).Text);
        }

        void tubesdgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //si CurrentRow == null => ne rien faire
            if (tubesdgv.CurrentRow == null) return;

            //obtenir id de l'element delectionne
            int selectedId = Convert.ToInt32(tubesdgv.CurrentRow.Cells["Id"].Value);

            //obtenir instance de l'element selectionne
            _tube = _tubes.SingleOrDefault(x => x.Id == selectedId);

            //bind l'element dans l'interface
            BindTube();
        }

        void tubesdgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            //message de supression
            var dr = MessageBox.Show("الرجاء تأكيد الحذف", Text, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            e.Cancel = true;//annuler la supression de la ligne
            //si l'action de supression est annule
            if (dr == DialogResult.Cancel)
            {
                return;
            }
            //supprimer l'element selectionne
            _repository.DeleteById(_tube.Id);

            //vider le champs de saisi
            ClearData();

            //recharger les donnnes
            LoadData();
        }

        void okbtn_Click(object sender, EventArgs e)
        {
            //alimenter l'objet tube
            GetTube();

            //verifie si les donnees ne sont pas vide (Trim() pour supprimer les espace au debut et a la fin)
            if (_tube.Abriviation.Trim() == "" || _tube.Designation.Trim() == "") return;

            //inserrer ou modifier les donnes
            if (_tube.Id> 0)
                _repository.Update(_tube);
            else
                _repository.Add(_tube);

            //vider les champs de saisie
            ClearData();

            //recharger les donnes
            LoadData();
        }
        /**************************************************************/


        /*methode pour lier les donnees avec le form*******************/
        void BindTube()
        {
            //charger l'objet tube dans les champs de saisie
            abriviationtxt.Text = _tube.Abriviation;
            designationtxt.Text = _tube.Designation;
        }

        void GetTube()
        {
            //charger les champ de saisie dans l'objet tube
            _tube.Abriviation = abriviationtxt.Text;
            _tube.Designation = designationtxt.Text;
        }
        /**************************************************************/


        /*methode de chargement et mise en form  des donnees************/
        void LoadData()
        {
            //chargement des donnees
            _tubes = _repository.GetAll().ToList();
            _bs.DataSource = Helper.Utile.ListToDatatable(_tubes);//convertir la liste en datatable pour le filtrage
            tubesdgv.DataSource = _bs;
        }

        void MiseEnFormeGrid()
        {
            // ReSharper disable PossibleNullReferenceException
            tubesdgv.Columns["Id"].Visible = false; //cacher la column id

            //resize columns
            tubesdgv.Columns["Abriviation"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //afficher les text
            tubesdgv.Columns["Designation"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;// prendre l'espace restant de l'interface

            //changer les nom des columns
            tubesdgv.Columns["Abriviation"].HeaderText = "الإختصار";
            tubesdgv.Columns["Designation"].HeaderText = "الإسم";
        }
        /**************************************************************/


        /*vider les donnees*********************************************/
        void ClearData()
        {
            //vider les champs
            abriviationtxt.Text = designationtxt.Text = "";
            abriviationtxt.Focus();
            _tube = new Model.Tube();
        }
        /**************************************************************/
    }
}